home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI2 / LEZIONE6c.s < prev    next >
Text File  |  1994-07-28  |  9KB  |  257 lines

  1.  
  2. ; Lezione6c.s    STAMPIAMO VARIE RIGHE DI TESTO SULLO SCHERMO!!!
  3.  
  4.     SECTION    CiriCop,CODE
  5.  
  6. Inizio:
  7.     move.l    4.w,a6        ; Execbase in a6
  8.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  9.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  10.     jsr    -$198(a6)    ; OpenLibrary
  11.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  12.     move.l    d0,a6
  13.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist vecchia
  14.  
  15. ;     PUNTIAMO IL NOSTRO BITPLANE
  16.  
  17.     MOVE.L    #BITPLANE,d0    ; in d0 mettiamo l'indirizzo della PIC,
  18.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  19.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  20.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  21.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  22.  
  23.     move.l    #COPPERLIST,$dff080    ; Puntiamo la nostra COP
  24.     move.w    d0,$dff088        ; Facciamo partire la COP
  25.     move.w    #0,$dff1fc        ; Disattiva l'AGA
  26.     move.w    #$c00,$dff106        ; Disattiva l'AGA
  27.  
  28.     bsr.w    print        ; Stampa le linee di testo sullo schermo
  29.  
  30. mouse:
  31.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  32.     bne.s    mouse        ; se no, torna a mouse:
  33.  
  34.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  35.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  36.  
  37.     move.l    4.w,a6
  38.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  39.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  40.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  41.     rts            ; USCITA DAL PROGRAMMA
  42.  
  43. ;    Dati
  44.  
  45. GfxName:
  46.     dc.b    "graphics.library",0,0    
  47.  
  48. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  49.     dc.l    0    ; della graphics.library
  50.  
  51. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  52.     dc.l    0
  53.  
  54. ;    Routine che stampa caratteri larghi 8x8 pixel
  55.  
  56. PRINT:
  57.     LEA    TESTO(PC),A0    ; Indirizzo del testo da stampare in a0
  58.     LEA    BITPLANE,A3    ; Indirizzo del bitplane destinazione in a3
  59.     MOVEQ    #23-1,D3    ; NUMERO RIGHE DA STAMPARE: 23
  60. PRINTRIGA:
  61.     MOVEQ    #40-1,D0    ; NUMERO COLONNE PER RIGA: 40
  62. PRINTCHAR2:
  63.     MOVEQ    #0,D2        ; Pulisci d2
  64.     MOVE.B    (A0)+,D2    ; Prossimo carattere in d2
  65.     SUB.B    #$20,D2        ; TOGLI 32 AL VALORE ASCII DEL CARATTERE, IN
  66.                 ; MODO DA TRASFORMARE, AD ESEMPIO, QUELLO
  67.                 ; DELLO SPAZIO (che e' $20), in $00, quello
  68.                 ; DELL'ASTERISCO ($21), in $01...
  69.     MULU.W    #8,D2        ; MOLTIPLICA PER 8 IL NUMERO PRECEDENTE,
  70.                 ; essendo i caratteri alti 8 pixel
  71.     MOVE.L    D2,A2
  72.     ADD.L    #FONT,A2    ; TROVA IL CARATTERE DESIDERATO NEL FONT...
  73.  
  74.                 ; STAMPIAMO IL CARATTERE LINEA PER LINEA
  75.     MOVE.B    (A2)+,(A3)    ; stampa LA LINEA 1 del carattere
  76.     MOVE.B    (A2)+,40(A3)    ; stampa LA LINEA 2  " "
  77.     MOVE.B    (A2)+,40*2(A3)    ; stampa LA LINEA 3  " "
  78.     MOVE.B    (A2)+,40*3(A3)    ; stampa LA LINEA 4  " "
  79.     MOVE.B    (A2)+,40*4(A3)    ; stampa LA LINEA 5  " "
  80.     MOVE.B    (A2)+,40*5(A3)    ; stampa LA LINEA 6  " "
  81.     MOVE.B    (A2)+,40*6(A3)    ; stampa LA LINEA 7  " "
  82.     MOVE.B    (A2)+,40*7(A3)    ; stampa LA LINEA 8  " "
  83.  
  84.     ADDQ.w    #1,A3        ; A1+1, avanziamo di 8 bit (PROSSIMO CARATTERE)
  85.  
  86.     DBRA    D0,PRINTCHAR2    ; STAMPIAMO D0 (40) CARATTERI PER RIGA
  87.  
  88.     ADD.W    #40*7,A3    ; ANDIAMO A CAPO
  89.  
  90.     DBRA    D3,PRINTRIGA    ; FACCIAMO D3 RIGHE
  91.  
  92.     RTS
  93.  
  94.  
  95.         ; numero caratteri per linea: 40
  96. TESTO:         ;          1111111111222222222233333333334
  97.          ;     1234567890123456789012345678901234567890
  98.     dc.b    '   PRIMA RIGA                           ' ; 1
  99.     dc.b    '                SECONDA RIGA            ' ; 2
  100.     dc.b    '     /\  /                              ' ; 3
  101.     dc.b    '    /  \/                               ' ; 4
  102.     dc.b    '                                        ' ; 5
  103.     dc.b    '        SESTA RIGA                      ' ; 6
  104.     dc.b    '                                        ' ; 7
  105.     dc.b    '                                        ' ; 8
  106.     dc.b    'FABIO CIUCCI COMMUNICATION INTERNATIONAL' ; 9
  107.     dc.b    '                                        ' ; 10
  108.     dc.b    '   1234567890 !@#$%^&*()_+|\=-[]{}      ' ; 11
  109.     dc.b    '                                        ' ; 12
  110.     dc.b    '     LA PALINGENETICA OBLITERAZIONE     ' ; 15
  111.     dc.b    '                                        ' ; 25
  112.     dc.b    '                                        ' ; 16
  113.     dc.b    '  Nel mezzo del cammin di nostra vita   ' ; 17
  114.     dc.b    '                                        ' ; 18
  115.     dc.b    '    Mi RitRoVaI pEr UnA sELva oScuRa    ' ; 19
  116.     dc.b    '                                        ' ; 20
  117.     dc.b    '    CHE LA DIRITTA VIA ERA SMARRITA     ' ; 21
  118.     dc.b    '                                        ' ; 22
  119.     dc.b    '  AHI Quanto a DIR QUAL ERA...          ' ; 23
  120.     dc.b    '                                        ' ; 24
  121.     dc.b    '                                        ' ; 25
  122.     dc.b    '                                        ' ; 26
  123.     dc.b    '                                        ' ; 27
  124.  
  125.     EVEN
  126.  
  127.  
  128.  
  129.     SECTION    GRAPHIC,DATA_C
  130.  
  131. COPPERLIST:
  132.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  133.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  134.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  135.     dc.w    $13e,$0000
  136.  
  137.     dc.w    $8E,$2c81    ; DiwStrt
  138.     dc.w    $90,$2cc1    ; DiwStop
  139.     dc.w    $92,$0038    ; DdfStart
  140.     dc.w    $94,$00d0    ; DdfStop
  141.     dc.w    $102,0        ; BplCon1
  142.     dc.w    $104,0        ; BplCon2
  143.     dc.w    $108,0        ; Bpl1Mod
  144.     dc.w    $10a,0        ; Bpl2Mod
  145.             ; 5432109876543210
  146.     dc.w    $100,%0001001000000000    ; 1 bitplane LOWRES 320x256
  147.  
  148. BPLPOINTERS:
  149.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  150.  
  151.     dc.w    $0180,$000    ; color0 - SFONDO
  152.     dc.w    $0182,$19a    ; color1 - SCRITTE
  153.  
  154.     dc.w    $6c07,$fffe    ; Sfumatura alla linea di testo 9
  155.     dc.w    $182,$451    ; linea1 del carattere
  156.     dc.w    $6d07,$fffe
  157.     dc.w    $182,$671    ; linea 2
  158.     dc.w    $6e07,$fffe
  159.     dc.w    $182,$891    ; linea 3
  160.     dc.w    $6f07,$fffe
  161.     dc.w    $182,$ab1    ; linea 4
  162.     dc.w    $7007,$fffe
  163.     dc.w    $182,$781    ; linea 5
  164.     dc.w    $7107,$fffe
  165.     dc.w    $182,$561    ; linea 6
  166.     dc.w    $7207,$fffe
  167.     dc.w    $182,$451    ; linea 7  l'ultima perche' la 8 e' azzerata
  168.                 ;       per fare spaziatura tra le linee
  169.  
  170.     dc.w    $7307,$fffe
  171.     dc.w    $182,$19a    ; colore normale
  172.  
  173.     dc.w    $8c07,$fffe    ; Sfumatura alla linea di testo 11
  174.     dc.w    $182,$516    ; linea1 del carattere
  175.     dc.w    $8d07,$fffe
  176.     dc.w    $182,$739    ; linea 2
  177.     dc.w    $8e07,$fffe
  178.     dc.w    $182,$95b    ; linea 3
  179.     dc.w    $8f07,$fffe
  180.     dc.w    $182,$c6f    ; linea 4
  181.     dc.w    $9007,$fffe
  182.     dc.w    $182,$84a    ; linea 5
  183.     dc.w    $9107,$fffe
  184.     dc.w    $182,$739    ; linea 6
  185.     dc.w    $9207,$fffe
  186.     dc.w    $182,$517    ; linea 7  l'ultima perche' la 8 e' azzerata
  187.  
  188.  
  189.     dc.w    $9307,$fffe
  190.     dc.w    $182,$19a    ; colore normale
  191.  
  192.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  193.  
  194. ;    Il FONT caratteri 8x8
  195.  
  196. FONT:
  197.     incbin    "metal.fnt"    ; Carattere largo
  198. ;    incbin    "normal.fnt"    ; Simile ai caratteri kickstart 1.3
  199. ;    incbin    "nice.fnt"    ; Carattere stretto
  200.  
  201.     SECTION    MIOPLANE,BSS_C    ; Le SECTION BSS devono essere fatte di
  202.                 ; soli ZERI!!! si usa il DS.b per definire
  203.                 ; quanti zeri contenga la section.
  204.  
  205. BITPLANE:
  206.     ds.b    40*256    ; un bitplane lowres 320x256
  207.  
  208.     end
  209.  
  210.  
  211. Come avrete visto, il fatto che il font sia ad un solo colore non vieta di
  212. cambiare il colore ogni linea con i WAIT del copper!
  213. Per scrivere molte righe l'una sotto l'altra e' bastato "ANDARE A CAPO" e
  214. stampare la linea seguente, per un numero di volte specificato in D3
  215.  
  216.     ADD.W    #40*7,A3    ; ANDIAMO A CAPO
  217.     DBRA    D3,PRINTRIGA    ; FACCIAMO D3 RIGHE
  218.  
  219. NOTA: per andare a capo serve scendere di 7 linee. Per RIGA intendo RIGA DI
  220. TESTO, alta 8 pixel, per linea intendo LINEA VIDEO effettiva.
  221.  
  222. Ecco perche' per andare a capo serve un "ADD.W #40*7,A3" :
  223.  
  224. Il problema puo' nascere dall'impressione di trovarsi gia' con l'indirizzo in
  225. a3 all'ultima linea del carattere appena stampata, per cui verrebbe da pensare
  226. che basti scattare avanti di 1 per trovarsi alla riga di testo successiva, ma
  227. in realta' in A3 c'e' sempre e solo l'indirizzo della prima linea dei caratteri
  228. infatti le atre 7 linee sono stampate tramite OFFSET:
  229.  
  230.     MOVE.B    (A2)+,(A3)    ; stampa LA LINEA 1 del carattere
  231.     MOVE.B    (A2)+,40(A3)    ; stampa LA LINEA 2  " "
  232.     MOVE.B    (A2)+,40*2(A3)    ; stampa LA LINEA 3  " "
  233.     MOVE.B    (A2)+,40*3(A3)    ; stampa LA LINEA 4  " "
  234.     MOVE.B    (A2)+,40*4(A3)    ; stampa LA LINEA 5  " "
  235.     MOVE.B    (A2)+,40*5(A3)    ; stampa LA LINEA 6  " "
  236.     MOVE.B    (A2)+,40*6(A3)    ; stampa LA LINEA 7  " "
  237.     MOVE.B    (A2)+,40*7(A3)    ; stampa LA LINEA 8  " "
  238.  
  239. Ma il registro A3 punta sempre alla prima linea. Infatti ogni volta che viene
  240. stampato un carattere, si avanza al carattere successivo aggiungendo 8 bit,
  241. ossia 1 byte, all'indirizzo in A3, il quale poi puntera' alla prima linea del
  242. carattere successivo:
  243.  
  244.     ADDQ.w    #1,A3        ; A1+1, avanziamo di 8 bit (PROSSIMO CARATTERE)
  245.  
  246. A questo punto per stampare quel "carattere successivo" bastera' rieseguire la
  247. routine con le distanze di indirizzamento (OFFSET).
  248. Vediamo cosa succede quando ci troviamo ad aver stampato l'ultimo carattere a
  249. destra, ossia l'ultimo di una riga: in A3 abbiamo l'indirizzo della prima linea
  250. dell'ultimo carattere in questione, dopo le istruzioni che stampano facendo
  251. l'offset da A3, c'e' l'istruzione che fa scattare A3 agli 8 bit successivi, in
  252. questo caso fa scattare all'inizio della seconda linea. E' per questo che per
  253. portare A3 alla prima linea della riga successiva basta scendere di 7 linee e
  254. non di 8, perche' ci trovavamo gia' all'inizio della seconda linea.
  255.  
  256.  
  257.